package com.youlv.yl.aop;

import com.youlv.yl.vo.R;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @author fenghe
 * @date 2022/1/10 20:08
 */
@Component
@Aspect
public class ParamCheckAop {

    /** 定义切入点，controller包下的类*/
    @Pointcut("execution(public * com.youlv.yl.controller..*.*(..))")
    public void checkParam() {

    }

    @Around("checkParam()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 获取切点的署名
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();

        // 得到拦截的方法
        Method method = signature.getMethod();

        // 获取方法参数注解，返回二维数组是因为某些参数可能有多个注解
        Annotation[][] parameterAnnotations = method.getParameterAnnotations();
        if(parameterAnnotations == null || parameterAnnotations.length == 0) {
            return proceedingJoinPoint.proceed();
        }

        // 获取方法参数名
        String[] parameterNames = signature.getParameterNames();
        // 获取参数值
        Object[] parameterValues = proceedingJoinPoint.getArgs();
        // 获取方法参数类型
        Class<?>[] parameterTypes = method.getParameterTypes();

        for(int i = 0; i < parameterAnnotations.length; i++) {
            for (int j = 0; j < parameterAnnotations[0].length; j++) {

                // 如果参数注解不为空，且参数注解是ParamCheck的派生类，且notNull是true，且 参数值为null 参数为空
                if(!(parameterAnnotations[i][j] instanceof ParamCheck)) {
                    return proceedingJoinPoint.proceed();
                }
                if(parameterAnnotations[i][j] != null && ((ParamCheck) parameterAnnotations[i][j]).notNull()) {
                    if(parameterValues[i] == null) {
                        return R.fail("请正确传入参数！！！");
                    }
//                    System.out.println(parameterValues[i]);
//                    System.out.println(parameterNames[i]);
//                    System.out.println(parameterTypes[i]);

                    // 获取对象中的参数值，并以，切割转为字符串
                    String[] split = parameterValues[i].toString().split(",");
                    for (String s : split) {
                        if(s.endsWith("=") || s.endsWith("=)")) {
                            return R.fail("请正确传入参数！！！");
                        } else {

                        }
                    }
                    return proceedingJoinPoint.proceed();
                }
            }
        }
        return proceedingJoinPoint.proceed();
    }
}
